package org.vin.tempctl;

import com.intelligt.modbus.jlibmodbus.Modbus;
import com.intelligt.modbus.jlibmodbus.exception.ModbusIOException;
import com.intelligt.modbus.jlibmodbus.master.ModbusMaster;
import com.intelligt.modbus.jlibmodbus.master.ModbusMasterFactory;
import com.intelligt.modbus.jlibmodbus.tcp.TcpParameters;

import java.net.InetAddress;

/**
 * modbus通讯，使用jlibmodbus，实现功能码04
 *
 */
public class ModbusDemo {

    public static void main(String[] args) {
        if (args.length != 5) {
            System.out.println("请提供5个入参，分别是IP,Port,slaveId,offset,unit...");
            return;
        }

        for (String arg:args) {
            System.out.println(arg);
        }
        String IP = args[0];
        String port = args[1];
        String _slaveId = args[2];
        String _offset = args[3];
        String _unit = args[4];
        try {
            // 设置主机TCP参数
            TcpParameters tcpParameters = new TcpParameters();
            // 设置TCP的ip地址
            InetAddress adress = InetAddress.getByName(IP);
            // TCP参数设置ip地址
            // tcpParameters.setHost(InetAddress.getLocalHost());
            tcpParameters.setHost(adress);
            // TCP设置长连接
            tcpParameters.setKeepAlive(true);
            // TCP设置端口，这里设置是默认端口502
            tcpParameters.setPort(Integer.parseInt(port));
            // 创建一个主机
            ModbusMaster master = ModbusMasterFactory.createModbusMasterTCP(tcpParameters);
            Modbus.setAutoIncrementTransactionId(true);
            if (!master.isConnected()) {
                master.connect();// 开启连接
            }
            try {
                int slaveId = Integer.parseInt(_slaveId); //1; //从机地址
                //setTemperature
                int offset = Integer.parseInt(_offset) ; // 11;//温度设定值  RW 0.01 在斜率作用下运行时会发生变化当前设定值
                int unit = Integer.parseInt(_unit) ;// 50;

                //setTemrate
                //int offset = 60;//60  温度斜率  RW  0.1
                //int unit = 50;
                //setOn
                // int offset = 1;//寄存器开始地址
                // int unit = 3;//寄存器

                //setOff
                //int offset = 1;//寄存器开始地址
                //int unit = 2;//寄存器

                master.writeSingleRegister(slaveId, offset, unit);

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    master.disconnect();
                } catch (ModbusIOException e) {
                    e.printStackTrace();
                }
            }

        } catch (RuntimeException e) {
            throw e;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
